/**
 * @description 剑网三工具类
 */

/**
 * @description 格式化时间戳为可读字符串
 * @param {number} timestamp - 时间戳
 * @param {string} format - 格式化模板
 * @returns {string} 格式化后的时间字符串
 */
function formatTimestamp(timestamp, format = 'YYYY-MM-DD HH:mm:ss') {
  const date = new Date(timestamp)
  
  const replacements = {
    'YYYY': date.getFullYear(),
    'MM': String(date.getMonth() + 1).padStart(2, '0'),
    'DD': String(date.getDate()).padStart(2, '0'),
    'HH': String(date.getHours()).padStart(2, '0'),
    'mm': String(date.getMinutes()).padStart(2, '0'),
    'ss': String(date.getSeconds()).padStart(2, '0')
  }
  
  return format.replace(/YYYY|MM|DD|HH|mm|ss/g, match => replacements[match])
}

/**
 * @description 计算剩余时间文本
 * @param {number} targetTime - 目标时间戳
 * @returns {string} 剩余时间文本
 */
function getRemainingTimeText(targetTime) {
  const now = Date.now()
  const diff = targetTime - now
  
  if (diff <= 0) {
    return '已结束'
  }
  
  const seconds = Math.floor(diff / 1000)
  const minutes = Math.floor(seconds / 60)
  const hours = Math.floor(minutes / 60)
  const days = Math.floor(hours / 24)
  
  if (days > 0) {
    return `${days}天${hours % 24}小时后`
  } else if (hours > 0) {
    return `${hours}小时${minutes % 60}分钟后`
  } else {
    return `${minutes}分钟后`
  }
}

/**
 * @description 判断字符串中是否包含关键词
 * @param {string} text - 文本内容
 * @param {Array<string>} keywords - 关键词列表
 * @returns {boolean} 是否包含任一关键词
 */
function containsKeyword(text, keywords) {
  if (!text) return false
  const lowerText = text.toLowerCase()
  return keywords.some(keyword => lowerText.includes(keyword.toLowerCase()))
}

/**
 * @description 解析服务器名称，处理常见简写
 * @param {string} serverName - 服务器名称输入
 * @returns {string} 标准化的服务器名称
 */
function parseServerName(serverName) {
  // 服务器名称映射表
  const serverMap = {
    // 电信区
    '梦江': '梦江南',
    '梦': '梦江南',
    '绝代': '绝代天骄',
    '天鹅': '天鹅坪',
    '青梅': '青梅煮酒',
    // 网通区
    '破阵': '破阵子',
    '飞凤': '飞凤里',
    // 其他简写映射...
  }
  
  return serverMap[serverName] || serverName
}

/**
 * @description 过滤字符串中的敏感词
 * @param {string} text - 原始文本
 * @param {Array<string>} sensitiveWords - 敏感词列表
 * @returns {string} 过滤后的文本
 */
function filterSensitiveWords(text, sensitiveWords) {
  if (!text) return ''
  
  let filteredText = text
  sensitiveWords.forEach(word => {
    const regex = new RegExp(word, 'gi')
    filteredText = filteredText.replace(regex, '*'.repeat(word.length))
  })
  
  return filteredText
}

/**
 * @description 随机选择数组中的一个元素
 * @param {Array} array - 数组
 * @returns {*} 随机元素
 */
function randomChoice(array) {
  if (!array || array.length === 0) return null
  const index = Math.floor(Math.random() * array.length)
  return array[index]
}

/**
 * @description 判断当前是否是节日
 * @returns {object|null} 节日信息或null
 */
function getCurrentFestival() {
  const now = new Date()
  const month = now.getMonth() + 1
  const day = now.getDate()
  
  // 节日列表
  const festivals = [
    { name: '春节', month: 2, day: 12, duration: 7 },
    { name: '元宵节', month: 2, day: 26, duration: 1 },
    { name: '端午节', month: 6, day: 14, duration: 3 },
    { name: '中秋节', month: 9, day: 21, duration: 3 },
    { name: '重阳节', month: 10, day: 7, duration: 1 },
    { name: '冬至', month: 12, day: 21, duration: 1 }
    // 其他节日...
  ]
  
  for (const festival of festivals) {
    if (month === festival.month) {
      if (day >= festival.day && day < festival.day + festival.duration) {
        return festival
      }
    }
  }
  
  return null
}

/**
 * @description 限制文本长度，超出部分显示为省略号
 * @param {string} text - 文本内容
 * @param {number} maxLength - 最大长度
 * @returns {string} 处理后的文本
 */
function truncateText(text, maxLength = 100) {
  if (!text) return ''
  if (text.length <= maxLength) return text
  return text.substring(0, maxLength) + '...'
}

/**
 * @description 获取当前用户在团队中的角色
 * @param {Array} members - 团队成员列表
 * @param {string} userId - 用户ID
 * @returns {string} 角色名称
 */
function getUserRoleInTeam(members, userId) {
  if (!members || !userId) return null
  
  const member = members.find(m => m.userId === userId)
  return member ? member.roleName : null
}

// 导出工具函数
module.exports = {
  formatTimestamp,
  getRemainingTimeText,
  containsKeyword,
  parseServerName,
  filterSensitiveWords,
  randomChoice,
  getCurrentFestival,
  truncateText,
  getUserRoleInTeam
} 